package com.lcy.algorithm.huawei;

import java.util.*;

/**
 * 题目描述︰给你一个字符串s，字符串s首尾相连成一个环形，请你在环中找出 'l'、'o'、'x'字符都恰好出现了偶数次最长子字符串的长度。输入描述∶输入是一串小写的字母组成的字符串。
 * 输出描述∶输出是一个整数
 * 补充说明:1<= s.length <= 5 x 10^5
 * s只包含小写英文字母。
 * 示例
 * 示例1
 * 输入: alolobo输出∶6
 * 说明∶最长子字符串之一是"alolob"，它包含l，'o各2个，以及0个'x’。
 * 示例2
 * 输入: looxdolx输出∶7
 * 说明︰最长子字符串是"oxdolxl"，由于是首尾连接在一起的，所以最后一个'×'和开头的''是连接在
 * -起的，此字符串包含2个l，2个 'o’，2个'×’。
 * 示例3
 * 输入: bcbcbc输出∶6
 * 说明︰这个示例中，字符串"bcbcbc"本身就是最长的，因为'l'、'o'、'x'都出现了0次。
 */
public class 最长子字符串长度 {
    private static HashMap<Character, Integer> match = new HashMap<>(3);

    static {
        match.put('l', 1);
        match.put('o', 2);
        match.put('x', 4);
    }

    public static void main(String[] args) {
        String s = "alolobo"; // 示例输入
        int result = findTheLongestSubstring(s);
        System.out.println(result); // 输出结果为6

        String s2 = "looxdolx"; // 示例输入
        int result2 = findTheLongestSubstring(s2);
        System.out.println(result2); // 输出结果为7

        String s3 = "bcbcbc"; // 示例输入
        int result3 = findTheLongestSubstring(s3);
        System.out.println(result3); // 输出结果为6
    }

    public static int findTheLongestSubstring(String s) {
        HashMap<Integer, Integer> stateMap = new HashMap<>();
        int stauts = 0;
        int max = 0;
        stateMap.putIfAbsent(0, -1);
        for (int i = 0; i < s.length() * 2; i++) {
            char c = s.charAt(i % s.length());
            if (match.containsKey(c)) {
                stauts ^= match.get(c);
            }
            if (stateMap.containsKey(stauts)) {
                //如果i-上一次该状态的位置超出了length,那么需要作废，需要用当前i-s.length计算大小
                if ((i - stateMap.get(stauts)) > s.length()) {
                    max = Math.max(max, i - s.length());
                } else {
                    max = Math.max(max, i - stateMap.get(stauts));
                }
            }
            stateMap.putIfAbsent(stauts, i);
        }
        return max;
    }
}
